/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wf3.gps;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author john
 */
public class Portafolio implements Serializable{
    
    private Escenario escenario;
    private List<PunConfig> l_puntos_disponibles;
    private List<PunConfig> l_puntos_mostrados;
    private Filtro filtro_selec;
    private List<Filtro> l_filtros_disponibles;
    private String ti_sortca = "asc";
    private String ti_sortno = "asc";
    
    public Portafolio(List<Filtro> l_filtros_disponibles, List<PunConfig> l_puntos_disponibles, Escenario escenario){
        this.l_filtros_disponibles =l_filtros_disponibles;
        this.l_puntos_disponibles = l_puntos_disponibles;
        this.escenario = escenario;
        this.l_puntos_mostrados = new ArrayList<>();
        
        for(Filtro f : l_filtros_disponibles){
            if(f.getNu_geocap() == escenario.getFiltro_selec().getNu_geocap()){
                this.filtro_selec = f;
            }
        }
        quitarPuntos(l_filtros_disponibles);
        
        for(Agrupamiento a :escenario.getFiltro_selec().getL_agrupa()){
            if(a.isIl_select()){
                for(Agrupamiento a2 : filtro_selec.getL_agrupa()){
                    if(a.getNu_geocapval() == a2.getNu_geocapval()){
                        seleccionar_agrupamiento(a2.getNu_geocapval());
                    }
                }
            }
        }
    }

    public Escenario getEscenario() {
        return escenario;
    }

    public void setEscenario(Escenario escenario) {
        this.escenario = escenario;
    }

    public List<PunConfig> getL_puntos_disponibles() {
        return l_puntos_disponibles;
    }

    public void setL_puntos_disponibles(List<PunConfig> l_puntos_disponibles) {
        this.l_puntos_disponibles = l_puntos_disponibles;
    }

    public List<PunConfig> getL_puntos_mostrados() {
        return l_puntos_mostrados;
    }

    public void setL_puntos_mostrados(List<PunConfig> l_puntos_mostrados) {
        this.l_puntos_mostrados = l_puntos_mostrados;
    }

    public Filtro getFiltro_selec() {
        return filtro_selec;
    }

    public void setFiltro_selec(Filtro filtro_selec) {
        this.filtro_selec = filtro_selec;
    }

    public List<Filtro> getL_filtros_disponibles() {
        return l_filtros_disponibles;
    }

    public void setL_filtros_disponibles(List<Filtro> l_filtros_disponibles) {
        this.l_filtros_disponibles = l_filtros_disponibles;
    }
    
    public String getTi_sortca() {
        return ti_sortca;
    }

    public void setTi_sortca(String ti_sortca) {
        this.ti_sortca = ti_sortca;
    }

    public String getTi_sortno() {
        return ti_sortno;
    }

    public void setTi_sortno(String ti_sortno) {
        this.ti_sortno = ti_sortno;
    }
    
    public synchronized void seleccionar_agrupamiento(int nu_geocapval){
        for(Agrupamiento a : filtro_selec.getL_agrupa()){
            if(a.getNu_geocapval() == nu_geocapval){
                a.setIl_select(true);
                //agregar a la lista de puntos mostrados si no existe
                for(PunConfig p : a.getL_config()){
                    boolean existe = false;
                    for(PunConfig p2 : l_puntos_mostrados){
                        if(p.getId_pungeo() == p2.getId_pungeo()){
                            existe = true;
                            break;
                        }
                    }
                    if(!existe){
                        l_puntos_mostrados.add(p);
                    }
                }
                break;
            }
        }
    }
    
    public synchronized void deseleccionar_agrupamiento(int nu_geocapval){
        for(Agrupamiento a : filtro_selec.getL_agrupa()){
            if(a.getNu_geocapval() == nu_geocapval){
                a.setIl_select(false);
                //eliminar de la lista de puntos mostrados si existe
                for(PunConfig p : a.getL_config()){
                    boolean existe = false;
                    for(PunConfig p2 : l_puntos_mostrados){
                        if(p.getId_pungeo() == p2.getId_pungeo()){
                            existe = true;
                            break;
                        }
                    }
                    if(existe){
                        l_puntos_mostrados.remove(p);
                    }
                }
                break;
            }
        }
    }
    
    public void cambiar_filtro(int nu_geocap){
        for(Agrupamiento a : filtro_selec.getL_agrupa()){
            if(a.isIl_select()){
                deseleccionar_agrupamiento(a.getNu_geocapval());
            }
        }
        for(Filtro f : l_filtros_disponibles){
            if(f.getNu_geocap() == nu_geocap){
                this.filtro_selec = f;
            }
        }
        seleccionarAllAgrupamientos();
    }
    
    private void seleccionarAllAgrupamientos(){
        for(Agrupamiento a : this.filtro_selec.getL_agrupa()){
            seleccionar_agrupamiento(a.getNu_geocapval());
        }
    }
    
    public void ordenarAgrupamientos(String tipo, String modo){
        if(tipo.equals("nombre")){
            if(modo.equals("asc")){
                Collections.sort(filtro_selec.getL_agrupa(), new Comparator<Agrupamiento>() {
                    @Override
                    public int compare(Agrupamiento a1, Agrupamiento a2) {
                        return a1.getNo_agrupa().compareTo(a2.getNo_agrupa());
                    }
                });
            }else if(modo.equals("desc")){
                Collections.sort(filtro_selec.getL_agrupa(), new Comparator<Agrupamiento>() {
                    @Override
                    public int compare(Agrupamiento a1, Agrupamiento a2) {
                        return a1.getNo_agrupa().compareTo(a2.getNo_agrupa());
                    }
                });
                Collections.reverse(filtro_selec.getL_agrupa());
            }
            ti_sortno = modo;
            
        }else if(tipo.equals("cantidad")){
            if(modo.equals("asc")){
                Collections.sort(filtro_selec.getL_agrupa(), new Comparator<Agrupamiento>() {
                    @Override
                    public int compare(Agrupamiento a1, Agrupamiento a2) {
                        int value = 0;
                        if (a1.getL_config().size() > a2.getL_config().size())
                                value = 1;
                        else if (a1.getL_config().size() < a2.getL_config().size())
                                value = -1;
                        else if (a1.getL_config().size() == a2.getL_config().size())
                                value = 0;
                        return value;
                    }
                });
            }else if(modo.equals("desc")){
                Collections.sort(filtro_selec.getL_agrupa(), new Comparator<Agrupamiento>() {
                    @Override
                    public int compare(Agrupamiento a1, Agrupamiento a2) {
                        int value = 0;
                        if (a1.getL_config().size() > a2.getL_config().size())
                                value = 1;
                        else if (a1.getL_config().size() < a2.getL_config().size())
                                value = -1;
                        else if (a1.getL_config().size() == a2.getL_config().size())
                                value = 0;
                        return value;
                    }
                });
                Collections.reverse(filtro_selec.getL_agrupa());
            }
            ti_sortca = modo;
        }
    }
    
    private void quitarPuntos(List<Filtro> filtros){
        for(Filtro f : filtros){
            for(Agrupamiento a : f.getL_agrupa()){
                Iterator<PunConfig> iterator = a.getL_config().iterator();
                while(iterator.hasNext()){
                    PunConfig pc = iterator.next();
                    boolean existe = false;
                    for(PunConfig p : l_puntos_disponibles){
                        if(p.getId_pungeo() == pc.getId_pungeo()){
                            existe = true;
                            break;
                        }
                    }
                    if(!existe){
                        iterator.remove();
                    }
                }
            }
        }
    }
}
